/*
  This file is part of Subsonic.
    Subsonic is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
    Subsonic is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    GNU General Public License for more details.
    You should have received a copy of the GNU General Public License
    along with Subsonic. If not, see <http://www.gnu.org/licenses/>.
    Copyright 2014 (C) Scott Jackson
*/

package net.nullsum.audinaut.service.parser;

import android.content.Context;

import net.nullsum.audinaut.domain.MusicFolder;
import net.nullsum.audinaut.domain.User;
import net.nullsum.audinaut.domain.User.Setting;
import net.nullsum.audinaut.service.MusicService;
import net.nullsum.audinaut.service.MusicServiceFactory;

import org.xmlpull.v1.XmlPullParser;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class UserParser extends AbstractParser {

    public UserParser(Context context, int instance) {
        super(context, instance);
    }

    public List<User> parse(InputStream inputStream) throws Exception {
        init(inputStream);
        List<User> result = new ArrayList<>();
        List<MusicFolder> musicFolders = null;
        User user = null;
        int eventType;

        String tagName = null;
        do {
            eventType = nextParseEvent();
            if (eventType == XmlPullParser.START_TAG) {
                tagName = getElementName();
                if ("user".equals(tagName)) {
                    user = new User();
                    result.add(user);
                } else if ("error".equals(tagName)) {
                    handleError();
                }
            } else if (eventType == XmlPullParser.TEXT) {
                if ("folder".equals(tagName)) {
                    String id = getText();
                    if (musicFolders == null) {
                        musicFolders = getMusicFolders();
                    }

                    if (user != null) {
                        if (user.getMusicFolderSettings() == null) {
                            for (MusicFolder musicFolder : musicFolders) {
                                user.addMusicFolder(musicFolder);
                            }
                        }

                        for (Setting musicFolder : user.getMusicFolderSettings()) {
                            if (musicFolder.getName().equals(id)) {
                                musicFolder.setValue(true);
                                break;
                            }
                        }
                    }
                }
            }
        } while (eventType != XmlPullParser.END_DOCUMENT);

        validate();

        return result;
    }

    private List<MusicFolder> getMusicFolders() throws Exception {
        MusicService musicService = MusicServiceFactory.getMusicService(context);
        return musicService.getMusicFolders(false, context, null);
    }
}
